Universo Online
Web Sites Pessoais
Índice

Usando Macros

Você não tem que iniciar os registradores DS, SS e SP sempre que começa uma rotina assembly. Usar macros pode economizar muita digitação inútil e repetitiva. E você pode usar macros para, também, inicializar o segmento de pilha. Baixe macros.zip e tente por você mesmo. Veja como isso pode ser feito com esse exemplo, e a seguir veja dois programas usando essas macros (assumindo que elas residem no arquivo MASM.INC):
%define @DATA _DATA

%macro .MODEL 1
  %define %1
%endmacro

%macro .CODE 0      
 %ifdef TINY        ;se definido modele TINY (PROGRAMA .COM)
     group dgroup _TEXT _DATA  
     segment _TEXT class=CODE align=16
     resb 0x100
  ..start:
  %elifdef SMALL    ;senao, se definido modelo SMALL (PROGRAMA .EXE)
  ..start:
     mov ax, _STACK
     mov ss, ax
     mov sp, TOPO_DA_PILHA
  %else
  %error Voce deve definir um modelo de memoria
  %endif
%endmacro

%macro .STACK 1
   %ifdef TINY
   %error Perigo:O modelo TINY nao usa segmento de Pilha
   %endif
   segment _STACK STACK class=STACK align=16
   resb %1
   TOPO_DA_PILHA:
%endmacro

%macro .DATA 0
   segment _DATA class=DATA align=2
%endmacro

%macro RETURN 1
    mov ah, 0x4C
    mov al,%1
    int 0x21
%endmacro

%macro dosprint 1
 push ax
 push dx
    mov dx,%1
    mov ah,9
    int 0x21
 pop dx
 pop ax
%endmacro
OBSERVAÇÃO IMPORTANTE: Lembre-se de que Nasm é sensível a maiúsculas e minúsculas (para os mais delicados, ele é "case sensitive").

Agora veja dois exemplos de uso das macros acima, sendo o primeiro um programa do tipo .EXE, e o segundo um programa do tipo .COM criado a partir de arquivo objeto gerado pelo NASM:

EXEMPLO1.ASM


			;EXEMPLO DE USO DAS MACROS DE MASM.INC
;Digite: nasm -fobj exemplo1.asm
;Digite: alink exemplo1 -oEXE
; ou     tlink exemplo1;
;deve aparecer o arquivo exemplo1.exe
;--------------------------------------

%include "masm.inc"


.MODEL SMALL


.CODE
    mov ax, @DATA
    mov ds,ax
    dosprint MENSAGEM

    RETURN 0
.DATA
  MENSAGEM DB "Testando Macros", "$"

.STACK 0x100

EXEMPLO2.ASM

			;EXEMPLO DE USO DAS MACROS DE MASM.INC
;Digite: nasm -fobj exemplo2.asm
;Digite: tlink /t exemplo2;
;Deve ser entao produzido o executael exemplo2.com
;OBSERVACAO: Nasm e sensivel a maiusculas
;            e minusculas (veja o manual)
;-----------------------------------------------


%include "masm.inc"


.MODEL TINY


.CODE
    dosprint MENSAGEM

    RETURN 0
.DATA
  MENSAGEM DB "Testando Macros com programa .COM", "$"